package znet

import (
	"bytes"
	"encoding/binary"
	"errors"
	"zinxLearn/pkg/zinx/util"
	"zinxLearn/pkg/zinx/ziface"
)

type DataPack struct{}

func NewDataPack() *DataPack {
	return &DataPack{}
}
func (d *DataPack) GetHeadLen() uint32 {
	// Id uint32(4字节) +  DataLen uint32(4字节)
	return 8
}
func (d *DataPack) Pack(msg ziface.IMessage) ([]byte, error) {
	buf := bytes.NewBuffer([]byte{})
	if err := binary.Write(buf, binary.LittleEndian, msg.GetDataLen()); err != nil {
		return nil, err
	}
	if err := binary.Write(buf, binary.LittleEndian, msg.GetMsgID()); err != nil {
		return nil, err
	}
	return append(buf.Bytes(), msg.GetData()...), nil
}
func (d *DataPack) UnPack(data []byte) (ziface.IMessage, error) {
	buf := bytes.NewBuffer(data)
	msg := &Message{}
	if err := binary.Read(buf, binary.LittleEndian, &msg.DataLen); err != nil {
		return nil, err
	}
	if err := binary.Read(buf, binary.LittleEndian, &msg.ID); err != nil {
		return nil, err
	}
	if msg.DataLen > util.MaxPacketSize { // 最大长度
		return nil, errors.New("too large msg data recieved")
	}
	return msg, nil // 这里只用把包拆出来
}
